package logger.sd.protocol;

/**
 * Definicao do Protocolo de Comunicacao: LRP - LOG REQUEST PROTOCOL
 * 
 * Sintaxe Basica: Cliente: Command Args Logging Args 
 * Servidor: Command MENSAGEM | Command ERROR
 * 
 * @author wendell
 * 
 */
public enum LRP {

	// Comandos
	OK("OK"), NULL("NULL"), END("END"), GETLOGGER("GETLOGGER"),
	TOKENARRIVE("TOKEN_ARRIVE"),
	
	TOKEN("TOKEN"), LOG("LOG"), WAIT("WAIT"), ECHO("ECHO"),
	
	REPLY("REPLY"),
	

	// Logging
	FATAL("FATAL"), ERROR("ERROR"), WARN("WARN"), INFO("INFO"), DEBUG("DEBUG"), 
	TRACE("TRACE"),

	// Args - Devem ser entre aspas.
	WRITE("\"WRITE\""), LOG_ONLY("\"LOG_ONLY\""), ALL("\"ALL\""), NO("\"NO\""),

	// Mensagens (devem ser entre aspas)
	MENSAGEM_00("\"Requisicao Atendida\""),
	MENSAGEM_01("\"Requisicao colocada em buffer\""),

	// Erros (devem ser entre aspas)
	ERROR_00("\"Servidor Indisponivel\""), ERROR_01("\"Bad Request\""), 
	ERROR_02("\"Level not defined\""), ERROR_03("\"Requisicao nao esperada\""), 
	ERROR_69("\"Undefined ERROR\""), ERROR_666("\"Fatal ERROR!\""),

	// Simbolo de comentario do LRP
	COMENT("#");

	private final String message;

	/**
	 * Construtor.
	 * @param message
	 */
	private LRP(String message) {
		this.message = message;
	}

	/**
	 * Retorna a token para a aplicacao
	 */
	public String getMessage() {
		return this.message;
	}

	/**
	 * Mensagem de confirmacao do servidor
	 * 
	 * @return Mensagem padrao de sucesso
	 */
	public static String okMessage() {
		return OK.message + ' ' + MENSAGEM_00.message;
	}
	
	/**
	 * Mensagem de confirmacao do servidor
	 * 
	 * @return Mensagem padrao de sucesso
	 */
	public static String bufferMessage() {
		return OK.message + ' ' + MENSAGEM_01.message;
	}

	/**
	 * Mensagem de erro 01
	 * 
	 * @return Mensagem de requisicao mal formulada
	 */
	public static String error01() {
		return NULL.message + ' ' + ERROR_01.message;
	}

	/**
	 * Verifica se o comando eh um comando de logging
	 * 
	 * @param str
	 *            Comando da requisicao
	 * @return Se o comando eh umcomando de logging
	 */
	public static boolean isLogging(String str) {
		return str.equals(FATAL.getMessage()) || str.equals(ERROR.getMessage())
				|| str.equals(WARN.getMessage()) || str.equals(INFO.getMessage())
				|| str.equals(DEBUG.getMessage()) || str.equals(TRACE.getMessage());
	}

}
